/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package systole.persistence.userTypes;

import java.io.Serializable;
import java.math.BigDecimal;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Types;
import java.util.StringTokenizer;
import org.hibernate.Hibernate;

import org.hibernate.HibernateException;
import org.hibernate.usertype.UserType;
import systole.domain.signals.Segment;

/**
 *
 * @author jmj
 */
public class SegmentType implements UserType {

    private static final int[] SQL_TYPES = {Types.CLOB};

    private String segmentToString(Segment segment) {
        String result = "";
        if (segment != null) {
            int i = 0;
            while (segment.size() > i) {
                result = result.concat(segment.get(i).toString() + "|");
                i++;
            }
        }
        return result;
    }

    private Segment stringToSegment(String points) {
        Segment segment = new Segment();
        if (points != null) {
            StringTokenizer parser = new StringTokenizer(points, "|", false);
            while (parser.hasMoreElements()) {
                segment.add(new BigDecimal(parser.nextToken()));
            }
        }
        return segment;
    }

    @Override
    public Object assemble(Serializable arg0, Object arg1)
            throws HibernateException {
        return null;
    }

    @Override
    public Object deepCopy(Object o) throws HibernateException {
        if (o == null) {
            return null;
        }
        Segment segment = (Segment) o;
        Segment clone = new Segment(segment.toDoubleArray());
        return clone;
    }

    @Override
    public Serializable disassemble(Object arg0) throws HibernateException {
        // TODO Auto-generated method stub
        return null;
    }

    @Override
    public boolean equals(Object x, Object y) throws HibernateException {
        if (x == null || y == null) {
            return false;
        }
        return x.equals(y);
    }

    @Override
    public int hashCode(Object x) throws HibernateException {
        if (x != null) {
            return x.hashCode();
        }
        return 0;
    }

    @Override
    public boolean isMutable() {
        return false;
    }

    @Override
    public Object nullSafeGet(ResultSet rs, String[] strings, Object o)
            throws HibernateException, SQLException {
        String val = (String) Hibernate.TEXT.nullSafeGet(rs, strings[0]);
        return this.stringToSegment(val);
    }

    @Override
    public void nullSafeSet(PreparedStatement ps, Object o, int i)
            throws HibernateException, SQLException {
        String val = (String) this.segmentToString((Segment) o);
        ps.setString(i, val);
    }

    @Override
    public Object replace(Object arg0, Object arg1, Object arg2)
            throws HibernateException {
        return null;
    }

    @Override
    public Class returnedClass() {
        return Segment.class;
    }

    @Override
    public int[] sqlTypes() {
        return SegmentType.SQL_TYPES;
    }
}
